#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>

#include "errHDL.h"

static int buf_index = 0;
loff_t f_pos = 0;
int fill_buffer(char *buf, int maxsz, int fd) {
    ssize_t rd = pread(fd, buf, maxsz, f_pos);
    buf_index = 0;
    return rd;
}

char * readline_buffered(char *buf, int maxsz, int fd) {
    int i = buf_index;
    char *ret = buf + buf_index;

    while (i < maxsz && buf[i] != '\n') i++;

    if (i == maxsz) {
        // 如果没找到换行符, 再修改f_pos, 然后fill_buffer
        f_pos += buf_index;
        if (fill_buffer(buf, maxsz, fd) < 1) {
            return NULL;
        }

        // 把上面的内容重来一遍
        i = 0;
        ret = buf;
        while (i < maxsz && buf[i] != '\n') i++;

        /**
         * 如果还是没找到换行符, 那就是真没有了
         * BUGS: 如果最后一行没有换行符, 那么就不会被返回
         * 可以尝试判断fill_buffer的返回值, 来判断是否已经读完
        */
        if (i == maxsz) {
            return NULL;
        }
    }

    buf[i] = '\0';
    buf_index = i + 1;
    return ret;
}

void calcHashSimple(char *output, const char *input, int size) {
    memcpy(output, input, size);
    ++*output;
}
